using Microsoft.Extensions.Caching.Memory;
using System;
using System.Threading.Tasks;

namespace Ruitu.Edu.TrainingDemo.Services;

/// <summary>
/// 日期时间缓存服务接口 - 演示缓存机制的使用
/// 
/// 主要用途：
/// - 演示如何使用 IMemoryCache 缓存当前日期时间
/// - 展示 Orchard Core 动态缓存的使用方法
/// - 演示缓存失效机制
/// 
/// 使用场景：
/// - 需要缓存频繁访问的日期时间数据
/// - 演示不同缓存策略的实现
/// - 展示缓存与路由的关联
/// 
/// 设计原因：
/// - 遵循依赖注入模式，通过接口实现解耦
/// - 提供多种缓存策略供选择
/// - 支持缓存失效和路由相关缓存
/// 
/// 设计模式：
/// - 依赖注入模式：通过接口实现服务解耦
/// - 策略模式：提供多种缓存实现策略
/// - 工厂模式：通过服务容器创建缓存实例
/// </summary>
public interface IDateTimeCachingService
{
    /// <summary>
    /// 获取当前本地日期时间并使用 IMemoryCache 进行缓存
    /// </summary>
    /// <returns>当前本地日期时间或缓存的值</returns>
    Task<DateTime> GetMemoryCachedDateTimeAsync();

    /// <summary>
    /// 获取当前本地日期时间并使用 Orchard Core 动态缓存进行 30 秒缓存
    /// </summary>
    /// <returns>当前本地日期时间或缓存的值</returns>
    Task<DateTime> GetDynamicCachedDateTimeWith30SecondsExpiryAsync();

    /// <summary>
    /// 获取当前本地日期时间并使用 Orchard Core 动态缓存，特定于当前路由
    /// </summary>
    /// <returns>当前本地日期时间或缓存的值</returns>
    Task<DateTime> GetDynamicCachedDateTimeVariedByRoutesAsync();

    /// <summary>
    /// 使通过此服务缓存的所有条目失效
    /// </summary>
    Task InvalidateCachedDateTimeAsync();
}
